跳到主要内容

动画播放

⚠️ 警告:此功能已弃用,仅支持旧版运行时,不支持当前运行时。

选择起始动画

默认情况下,RiveViewModel 会自动播放你指定的动画或状态机。

SwiftUI

struct AnimationView: View {
var body: some View {
RiveViewModel(
fileName: "dancing_banana",
animationName: "Charleston",
artboardName: "Banana"
).view()
}
}

UIKit

class AnimationViewController: UIViewController {
@IBOutlet weak var riveView: RiveView!

var bananaVM = RiveViewModel(
fileName: "dancing_banana",
animationName: "Charleston",
artboardName: "Banana"
)

override func viewDidLoad() {
bananaVM.setView(riveView)
}
}

控制播放

调用播放控制

创建 RiveViewModel 后,你可以在此视图模型的引用上调用动画播放控制方法。

通常情况下,这已经足以显示你的 Rive 资源。但是,当你需要更精细地控制播放时机时,我们提供了一些方便的控制方法。

你还可以根据需要选择动画的循环模式作为附加参数。除了播放动画外,你同样可以暂停、停止和重置动画。

播放方法:

  • play(animationName: String? = nil, loop: Loop = .autoLoop, direction: Direction = .autoDirection)
    • animationName - 要播放的动画名称
    • loop - 播放动画的循环模式。可选值如下:
      • oneShot - 播放动画一次
      • loop - 播放动画并从设置的起始时间重复
      • pingPong - 播放动画从开始 → 结束,然后重复时从结束 → 开始
      • autoLoop(默认)- 按动画上设置的循环设置播放
    • direction - 播放动画的方向
      • backwards - 反向播放动画时间线
      • forwards - 正向播放动画时间线
      • autoDirection - 按动画上设置的方向播放
  • pause()
  • stop()
  • reset()

播放

如果你将 autoplay 设置为 false,可以很简单地播放活动动画或状态机。

simpleVM.play()

如果活动画板上有多个动画,你可以播放特定的一个。

simpleVM.play(animationName: "Fancy Animation")

暂停/停止/重置

根据应用中的某些事件,你可能需要进一步调整播放。

simpleVM.pause()
simpleVM.stop()
simpleVM.reset()

播放器代理

此运行时允许在 RiveViewModel 上设置代理。你可以使用代理定义函数来挂钩某些播放事件的调用。请参见以下类,了解如何挂钩以下播放事件:

  • played(已播放)
  • paused(已暂停)
  • stopped(已停止)
  • advanced(已前进)
  • animation looped(动画已循环)
class ToggleViewModel: RiveViewModel {
private let onAnimation: String = "On"
private let offAnimation: String = "Off"
private let startAnimation: String = "StartOff"

var action: ((Bool) -> Void)? = nil
var isOn = false {
didSet {
stop()
play(animationName: isOn ? onAnimation : offAnimation)
action?(isOn)
}
}

init() {
super.init(fileName: "toggle", animationName: startAnimation, fit: .cover)
}

func view(_ action: ((Bool) -> Void)? = nil) -> some View {
self.action = action
return super.view().frame(width: 100, height: 50, alignment: .center)
}

// 当动画播放时
override func player(playedWithModel riveModel: RiveModel?) {
if let animationName = riveModel?.animation?.name() {...}
}
// 当动画暂停时
override func player(pausedWithModel riveModel: RiveModel?) {
if let animationName = riveModel?.animation?.name() {...}
}
// 当动画停止时
override func player(stoppedWithModel riveModel: RiveModel?) {
if let animationName = riveModel?.animation?.name() {...}
}
// 当动画循环时
override func player(loopedWithModel riveModel: RiveModel?, type: Int) {
if let animationName = riveModel?.animation?.name() {...}
}
// 当动画前进时
override func player(didAdvanceby seconds: Double, riveModel: RiveModel?) {...}
}